前幾天在看Razor語法的時候我們用到了Layout和View,而現在又多一個Partial View,它其實只是View的某一部份。
當一個View設計的過度龐大或某個區塊需要被很多頁面重複使用時,為了避免寫重複的Code,或造成View太過複雜。通常,會將一個View中的某幾個部份獨立出來成為Partial View。
在命名上,為了能一眼與View做分辨,通常會在名稱面前統一加「__」。
建立一個View,並勾選partialView的選項
將想抽離的程式碼抽出來放在Partial View的cshtml檔案
@using MVCProject.Models
@model Product
<tr>
<td>
@Html.DisplayFor(modelModel => Model.ProductName)
</td>
<td>
@Html.DisplayFor(modelModel => Model.Price)
</td>
<td>
@Html.DisplayFor(modelModel => Model.Active)
</td>
<td>
@Html.DisplayFor(modelModel => Model.Stock)
</td>
<td>
@Html.DisplayFor(modelModel => Model.IdDeleted)
</td>
<td>
@Html.DisplayFor(modelModel => Model.Company.Name)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = Model.Id }) |
@Html.ActionLink("Details", "Details", new { id = Model.Id }) |
@Html.ActionLink("Delete", "Delete", new { id = Model.Id })
</td>
</tr>
接著就是插入Partial View要放的位置
@foreach (var item in Model) {
@Html.Partial("_Products", item);
}
Partial有四種多型@Html.Partial("_Products", item);
語法:Html.RenderPartial("_Products", item);
,基本上與Partial View效果一樣,他們之間的差別在於
第三個方式是藉由Action的方式,他會去呼叫Controller並將相對應的Partial View加進頁面中。
Step1: 在Controller中加一個Action Method
public ActionResult TimeNow()
{
return PartialView(DateTime.UtcNow.AddHours(8));
}
Step2: 實作一個顯示時間的區塊,接著要為TimeNow建立一個Partial View。
@model DateTime
<h2>Current Time : @Model.ToShortTimeString()
</h2>
Step3: 在Index引入partial View
@Html.Action("TimeNow")
結果:
但這時有個小問題,在我們前幾天聊到Routing的時候,有提到只要URL符合Route的規則,就可以連到指定的Action,而我們剛為Index,寫了一個TimeNow的ActionResult,那麼在網址嘗試輸入http://localhost:62990/Products/TimeNow
,結果發現。
畫面顯示出來了!那這個問題我們可以從昨天接觸到的ActionFilter進行解決,在TimeNow的Action Method上加一個Filter [ChildActionOnly]
,在執行一次結果,很輕鬆地就可以阻擋別人透過路由輸入看到一些不必要顯示的頁面。